import { Strategy } from 'passport-local';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { BaseService } from '../../modules/base/base.service';
import { ContextIdFactory, ModuleRef } from '@nestjs/core';
import { HttpErrorException } from '../exceptions';

@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
  constructor(
    private moduleRef: ModuleRef
  ) {
    super({
      passReqToCallback: true,
    });
  }

  async validate(
    request: Request,
    username: string,
    password: string
  ) {
    // 请务必将配置属性设置为 ，如上所示。passReqToCallbacktrue
    // 在下一步中，请求实例将用于获取当前上下文标识符，而不是生成新的标识符（在此处阅读有关请求上下文的更多信息）。
    // 现在，在类的方法中，使用类的方法基于请求对象创建上下文 ID，并将其传递给调用
    const contextId = ContextIdFactory.getByRequest(request);
    // "AuthService" is a request-scoped provider
    const baseService = await this.moduleRef.resolve(BaseService, contextId);
    const user = await baseService.validateUser(username, password);
    if (!user) {
      throw new HttpErrorException('用户名或密码错误');
    }
    return user
  }
}
